
#include <stdint.h>
#include "DisplayHAL.h"

/****************************************
 * 加入单片机平台的头文件
 ****************************************/
#include "main.h"
#include "gpio.h"
#include "spi.h"

#include "stm32h7xx_hal.h"

/****************************************
 *  移植函数
    所需移植的函数包括
    - DisplayHAL_SPI_Transmit8
    - DisplayHAL_GPIO_Write
    - DisplayHAL_SYS_Delay
    若需要DMA还需要
    - DisplayHAL_SPI_Transmit_DMA
 ****************************************/

void DisplayHAL_SPI_Transmit8(uint8_t data)
{
    HAL_SPI_Transmit(&hspi1,&data,1,HAL_MAX_DELAY);
}

#ifdef DISP_USE_DMA

uint8_t dmaBusyFlag = 0;
void DisplayHAL_SPI_Transmit_DMA(uint8_t *data, uint16_t len)
{
    dmaBusyFlag = 1;
    HAL_SPI_Transmit_DMA(&hspi1,data,len);
}
void DisplayHAL_SPI_Wait_DMA()
{
    while(dmaBusyFlag != 0); // 等待上一次DMA传输结束
    // while(HAL_DMA_GetState(hspi1.hdmatx) != HAL_DMA_STATE_READY){__NOP();};
}

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
    if(hspi->Instance == hspi1.Instance)
    {
        dmaBusyFlag = 0;
    }
}
#endif

void DisplayHAL_GPIO_Write(DisplayIOEnum_Typedef io,bool value)
{
    switch (io)
    {
    case DISP_IO_BL:
        HAL_GPIO_WritePin(LCD_BL_GPIO_Port,LCD_BL_Pin,value ? GPIO_PIN_SET : GPIO_PIN_RESET);
        break;
    case DISP_IO_CS:
        HAL_GPIO_WritePin(LCD_CS_GPIO_Port,LCD_CS_Pin,value ? GPIO_PIN_SET : GPIO_PIN_RESET);
        break;
    case DISP_IO_DC:
        HAL_GPIO_WritePin(LCD_DC_GPIO_Port,LCD_DC_Pin,value ? GPIO_PIN_SET : GPIO_PIN_RESET);
        break;
    case DISP_IO_RST:
        HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,value ? GPIO_PIN_SET : GPIO_PIN_RESET);
        break;
    default:
        break;
    }
}

inline void DisplayHAL_SYS_Delay(uint8_t ms)
{
    HAL_Delay(ms);
}